pub fn main() {
    // 切片
    // main1();

    // String 与 &str 的转换
    // main2();

    // 追加
    // main3();

    // 插入
    // main4();

    // 替换
    // main5();

    // 删除
    // main6();

    // 连接
    main7();
}

fn main1() {
    let s = "中国人"; // 中文在 UTF-8 字符串占用 3 个字节
    let s1 = &s[0..6]; // 所以截取中文时要取前 6 个字节
    println!("{}", s1); // 输出 中国
    let len = s.len();
    println!("{}", len); // 输出 9

    let my_name = String::from("张三");
    greet(my_name);
}

fn greet(name: String) {
    println!("你好，{}！", name);
}

fn main2() {
    // String 转换为 &str
    let s = String::from("hello");
    let s1 = s.as_str();
    assert_eq!("hello", s1);

    // &str 转换为 String
    let s2 = "hello";
    let s3 = s2.to_string();
    assert_eq!("hello", s3);
}

fn main3() {
    let mut s = String::from("hello");
    s.push_str(", world");
    println!("追加字符串 push_str() {}", s);

    s.push('!');
    println!("追加字符 push() {}", s);
}

fn main4() {
    let mut s = String::from("Hello rust!");
    s.insert(5, ',');
    println!("插入字符 insert() {}", s);

    s.insert_str(6, " I like");
    println!("插入字符串 insert_str() {}", s);
}

fn main5() {
    let s = String::from("Hello rust!");

    // 1、replace
    let new_s1 = s.replace("rust", "RUST");
    // println!("替换字符串 replace() {}", new_s1);
    dbg!(new_s1);

    // 2、replacen
    let new_s2 = s.replacen("Hello", "Hi", 1);
    // println!("替换字符串 replacen() {}", new_s2);
    dbg!(new_s2);

    // 3、replace_range
    let mut s = String::from("Hello rust!");
    s.replace_range(6..11, "RUST");
    // println!("替换字符串 replace_range() {}", s);
    dbg!(s);
}

fn main6() {
    let mut s = String::from("Hello rust!");

    // 1、 pop —— 删除并返回字符串的最后一个字符
    let mut string_pop = String::from("rust pop 中文!");
    let p1 = string_pop.pop();
    let p2 = string_pop.pop();
    dbg!(p1);
    dbg!(p2);
    dbg!(string_pop);

    // 2、 remove —— 删除并返回字符串中指定位置的字符
    let mut string_remove = String::from("测试remove方法");
    println!(
        "string_remove 占 {} 个字节",
        std::mem::size_of_val(string_remove.as_str())
    );
    // 删除第一个汉字
    string_remove.remove(0);
    // 下面代码会发生错误
    // string_remove.remove(1);
    // 直接删除第二个汉字
    // string_remove.remove(3);
    dbg!(string_remove);

    // 3、 truncate —— 删除字符串中从指定位置开始到结尾的全部字符
    let mut string_truncate = String::from("测试truncate");
    string_truncate.truncate(3);
    dbg!(string_truncate);

    // 4、 clear —— 清空字符串
    let mut string_clear = String::from("string clear");
    string_clear.clear();
    dbg!(string_clear);
}

fn main7() {
    // 1、使用 + 或者 += 连接字符串
    let s1 = String::from("Hello");
    let s2 = String::from("Rust");
    let s3 = s1 + " " + &s2 + "!";
    dbg!(s3);

    // 2、使用 format! 连接字符串
    let s1 = String::from("Hello");
    let s2 = String::from("Rust");
    let s3 = format!("{} {}!", s1, s2);
    dbg!(s3);
}